class C:
    # 无法动态添加其他属性
    # 创建对象的时候，划分的内存也是固定的
    # 限制之后的对象是没有 __dict__ 属性的，节省了空间
    __slots__ = ['x', 'y']

    def __init__(self, x):
        self.x = x


c = C(250)
print(c.x)
c.y = 520
print(c.y)


# AttributeError: 'C' object has no attribute '__dict__'
# print(c.__dict__)


# 我们通过 __slots__ 进行了属性的限制，这个类的对象只能有2个属性，x,y，其他的属性无法添加
# AttributeError: 'C' object has no attribute 'z'
# 无法动态属性
# c.z = 666


class D:
    __slots__ = ['x', 'y']

    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        # 由于 __slots__ 限制了只有 x y ，z属性无法添加
        self.z = z


# AttributeError: 'D' object has no attribute 'z'
# d = D(3, 4, 5)


# 继承自父类的 __slots__ 属性是不会在子类中生效的，Python 只关注各个具体类中定义的 __slots__ 属性
class E(C):
    pass


e = E(250)
print(e.x)  # 250

e.y = 520
print(e.y)  # 520

# 父类的 __slots__ 无法限制子类，所以子类还是可以动态添加其他属性
e.z = 666
print(e.z)  # 666

# 也有 __dict__ 属性
print(e.__dict__)  # {'z': 666}
